1
Vượt qua Bẫy NULL
AI013Lesson 2
00:00

Sự chuyển đổi từ các macro kiểu C sang các hằng số an toàn kiểu trong C++ đại diện cho một bước tiến cơ bản trong khả năng sử dụng ngôn ngữ, giải quyết vấn đề "Bẫy NULL" ở đó sự mơ hồ giữa giá trị 0 và macro gây ra các lỗi logic thầm lặng.

1. Sự thất bại trong việc giải quyết giao nhau (Overload Resolution)

Trong các chuẩn cũ (C++98), NULL thường được định nghĩa là 0. Khi được truyền vào các hàm giao nhau, trình biên dịch xử lý NULL như một số nguyên. Điều này được chứng minh bởi:

if (std::is_same<decltype(NULL), decltype(0)>::value)
std::cout << "NULL là một số nguyên";

2. Giải pháp nullptr

C++11 đã giới thiệu nullptr, một từ khóa thuộc kiểu std::nullptr_t. Khác với macro, nó không thể được chuyển đổi ngầm thành kiểu số nguyên (trừ kiểu bool), đảm bảo rằng các hàm giao nhau dành riêng cho con trỏ sẽ được chọn.

Bẫy Cổ điểnfoo(NULL)Gọi foo(int)Giải pháp Hiện đạifoo(nullptr)Gọi foo(char*)

3. Liên kết & Tương thích

C++ hiện đại yêu cầu extern "C" để ngăn chặn việc thay đổi tên khi liên kết với mã C (ví dụ: được biên dịch bằng gcc). Việc duy trì các con trỏ an toàn kiểu tại ranh giới này là điều quan trọng.

$$\text{std::nullptr\_t} \neq \text{số nguyên}$$

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>